/* //函数的定义，可以指定函数的参数的类型和返回值的类型
function hello(name: string): string {
    console.log('hello', name);
    return name;
}
hello('zhufeng');

//函数表达式
//如何在TS定义新的类型
//如何定义一个函数类型
type GetUserName = (firstName: string, lastName: string) => string;
let getUsername: GetUserName = function (firstName: string, lastName: string) {
    return firstName + lastName;
}
//如果说函数没有返回值
///如果规定一个函数的返回值类型是void,那么可以返回undefined,但不能返回null
function hello2(name: string): void {
    console.log('hello', name);
}
let result = hello2('zhufeng');
console.log(typeof result);
//可选参数
//在TS中函数的形参和实参必须一样，不一样就要配置可选参数，而且必须是最后一个参数
//在冒号的前面加上?的话表示这个参数可以传也可以不传，也就是可选参数
//必选参数不能位于可选参数后
function print2(name:string,age:number,home?:string,color?:string):void{
    console.log(name,age)
}
print2('zhufeng',18);
print2('zhufeng',18,'beijing','red');
//                   home     color
//默认参数
function ajax(url:string,method:string='GET'){
  console.log(method,url)
}
ajax('/a','POST');
ajax('/b');

//剩余参数
//从...开始后面的所有参数都会放在numbers数组中
function sum(...numbers:number[]):number{
  return numbers.reduce((a,b)=>a+b,0);
}
console.log(sum(1,2));//3
console.log(sum(1,2,3));//6
console.log(sum(1,2,3,4));//10

//函数重载
//在Java里，重载指的是两个或两个以上的同名函数，，但是参数的数量和类型不同
//在TS中，表示为同一个同名函数提供多个函数类型定义
let obj={name:'zhufeng',age:18,married:true};
//定义函数的重载，给同一个名称的函数多种定义,其实指是三种调用形式
function setAttribute(val:number):void//overload
function setAttribute(val:string):void//overload
function setAttribute(val:boolean):void//overload
function setAttribute(val:any){
    if(typeof val === 'string'){
        obj.name = val;
    }else if(typeof val === 'number'){
        obj.age = val;
    }else{
        obj.married=val;
    }
}
setAttribute('zhangsan');
setAttribute(28);
//没有与此调用匹配的重载
setAttribute(true); */